#include "argumentos.h"

bool somentenumeros(const char *v)
{
    // Checar se "v" está instanciado ou se tem tamanho zero:
    if (!v || !strlen(v)) return(false);
    // Checar se TODOS os caracteres de "v" são digitos:
    while (*v)
    {
        if (!isdigit(*v)) return(false);
        v++;
    }
    return(true);
}

argumentos argumentos_novo(unsigned int t, bool zerar)
{
    argumentos args;
    args.tamanho = 0;
    args.elementos = NULL;
    if (t)
    {
        size_t tambloco = t*sizeof(VALORES_TIPO);
        args.elementos = (VALORES_TIPO*)malloc(tambloco);
        if (args.elementos)
        {
            args.tamanho = t;
            if (zerar) memset(args.elementos,0,tambloco);
        }
    }
    return(args);
}

argumentos argumentos_string(char *str)
{
    argumentos args;
    args.tamanho = 0;
    args.elementos = NULL;
    if (!str || !strlen(str)) return(args);
    VALORES_TIPO aux[VALORES_TAMANHO];
    unsigned int aux_tamanho = 0;
    char *p = strtok(str,ARGUMENTOS_SEPARADOR);
    while(p)
    {
        if (aux_tamanho >= VALORES_TAMANHO) return(args);
        if (!somentenumeros(p)) return(args);
        // strtoull: converter de "char*" para "unsigned long long int".
        aux[aux_tamanho] = strtoull(p,NULL,10);
        aux_tamanho++;
        p = strtok(NULL,ARGUMENTOS_SEPARADOR);
    }
    args = argumentos_novo(aux_tamanho,false);
    if (args.tamanho) memcpy(args.elementos,aux,aux_tamanho*sizeof(VALORES_TIPO));
    return(args);
}

argumentos argumentos_copia(argumentos a)
{
    argumentos args;
    args.tamanho = 0;
    args.elementos = NULL;
    if (a.tamanho)
    {
        args = argumentos_novo(a.tamanho,false);
        if (args.tamanho) memcpy(args.elementos,a.elementos,a.tamanho*sizeof(VALORES_TIPO));
    }
    return(args);
}

void argumentos_del(argumentos a)
{
    free(a.elementos);
}

void argumentos_print(argumentos a)
{
    if (!a.tamanho) return;
    unsigned int i;
    printf("%"VALORES_PRINTF_FORMATO,a.elementos[0]);
    for (i=1 ; i<a.tamanho ; i++)
        printf(",%"VALORES_PRINTF_FORMATO,a.elementos[i]);
}
